/*
 * Copyright 2009 Brook Smith brook.smith@paradise.net.nz.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.javagenerate.generator.script.gen;

import org.javagenerate.generator.MethodDefinition;
import org.javagenerate.generator.Parameter;
import org.javagenerate.generator.script.ClassDef;
import org.javagenerate.generator.script.GenBeanDefinition;

public class GwtAsyn extends ClassDef {

	private String interfaceName;

	public GwtAsyn(String classname, String patternName) {
		super(classname, patternName);
		setClass(false);
		getImports().add("com.google.gwt.user.client.rpc.AsyncCallback");
		
		// void greetServer(String input, PersonDef personDef,
		// AsyncCallback<PersonDef> callback);
	}

	@Override
	public String getExtends() {
		return "BaseServiceAsync<" + interfaceName + ">";
	}
	
	@Override
	public void addBeanDefiniation(GenBeanDefinition beanDefinition) {
		// don't do anything here
	}

	private void addDeleteMethod() {
		MethodDefinition definition = new MethodDefinition("void", "deleteService");
		definition.addParameter(new Parameter("data", interfaceName));
		definition.addParameter(new Parameter("callback", "AsyncCallback<Boolean>"));
		definition.setInterface(true);

		addMethod(definition);
	}

	private void addQueryMethod() {
		MethodDefinition definition = new MethodDefinition("void", "queryService");
		definition.addParameter(new Parameter("query", "String"));
		definition.addParameter(new Parameter("callback", "AsyncCallback<" + interfaceName + "[]>"));
		definition.setInterface(true);

		addMethod(definition);

	}

	private void addSaveMethod() {
		MethodDefinition definition = new MethodDefinition("void", "saveService");
		definition.addParameter(new Parameter("data", interfaceName));
		definition.addParameter(new Parameter("callback", "AsyncCallback<" + interfaceName + ">"));
		definition.setInterface(true);

		addMethod(definition);
	}

	@Override
	public void preWrite() {
//		addQueryMethod();
//		addDeleteMethod();
//		addSaveMethod();
		
//		setTypeStatement(interfaceName);
		
		super.preWrite();
	}

	public void setInterfaceName(String interfaceName) {
		this.interfaceName = interfaceName;
	}
}
